package com.tom.architect02.p4.day35.retrofit;


import com.tom.architect02.p4.day35.simple2.Result;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Emitter;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;

public class RetrofitClient {
    private final static ServiceApi mServiceApi;

    static {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.api.com/httpServer/")
                .addConverterFactory(GsonConverterFactory.create()) // 添加解析转换工厂gson解析。
                .client(okHttpClient)
                // 支持Rxjava，okhttpCall。 适配器模式。
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

        // 用代理创建实例。ServiceApi接口--> 实例对象
        mServiceApi = retrofit.create(ServiceApi.class);
    }

    public static ServiceApi getServiceApi() {
        return mServiceApi;
    }


    // 封装公用部分代码。
    public static <T> Observable.Transformer<Result<T>, T> transformer() {
        return new Observable.Transformer<Result<T>, T>() {
            @Override
            public Observable<T> call(Observable<Result<T>> resultObservable) {
                // resultObservable -->   Observable<Result<UserInfo>> userLogin() 适配器模式，完成转换。
                return (Observable<T>) resultObservable.flatMap(new Func1<Result<T>, Observable<T>>() {
                            @Override
                            public Observable<T> call(Result<T> tResult) {
                                // 解析不同的情况，然后返回。
                                if (tResult.isOk()) {
                                    // 返回成功
                                    return createObservable(tResult.data);
                                } else {  // 返回失败
                                    return Observable.error(new ErrorHandle.ServiceError("200", tResult.getMsg()));
                                }
                            }
                        })
                        .subscribeOn(Schedulers.io())
                        .unsubscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());
            }
        };
    }

    // 成功情况下的返回。
    private static <T> Observable<T> createObservable(T data) {
        return Observable.create(new Action1<Emitter<T>>() {
            @Override
            public void call(Emitter<T> tEmitter) {
                tEmitter.onNext(data);
                tEmitter.onCompleted();

            }
        }, Emitter.BackpressureMode.NONE);
    }

}

